//
//  HMUserAccountVM.swift
//  HMWeibo12
//
//  Created by iOS on 16/9/19.
//  Copyright © 2016年 iOS. All rights reserved.
//

import UIKit

/// 负责 HMUserAccount 模型相关的操作
class HMUserAccountVM: NSObject {
    // 单例
    static let shared: HMUserAccountVM = HMUserAccountVM()
    
    // 属性,这个类里面都能访问
    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! + "/userAccount.plist"
    
    /// 账号模型,内存中
    var userAccount: HMUserAccount?
    
    var isUserLogin: Bool {
        get {
            // 有账号 返回true
            // 没有账号 返回false
            return userAccount != nil
        }
    }
    
    fileprivate override init() {
        super.init()
        
        // 加载磁盘中的账号
        userAccount = loadAccount()
    }

    /// 加载AccountToken,字典转模型,保存模型
    ///
    /// - parameter code: code
    func loadAccessToken(code: String, completion: @escaping (Error?) -> Void) {
        // url地址
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        // 请求参数
        let parameters = [
            "client_id": client_id,
            "client_secret": client_secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": redirect_uri
        ]
        
        // 发送POST请求
        HMNetworkTool.shared.request(method: .POST, URLString: urlString, parameters: parameters, progress: nil, success: { (_, responseObject) in
            print("获取到了accessToken: \(responseObject)")
            
            let dict = responseObject as! [String: Any]
            // 转模型
            let account = HMUserAccount(dict: dict)
            // 保存到内存中
            self.userAccount = account
            print("userAccount = \(account)")
            
            // 程序一退出就内存中的数据就没有了
            // 将模型保存到沙盒中,会触发 userAccount 对象 的
            NSKeyedArchiver.archiveRootObject(account, toFile: self.path)
            
            // 让控制器知道我们已经保存好了账号
            completion(nil)

            // 模拟出错
            // domain: 域, 表示失败范围
            // code: 错误码,自定义
            // userInfo: 错误信息
//            let error = NSError(domain: "cn.itheima.accessToken", code: -110, userInfo: ["错误信息" : "我故意搞出来的错误"])
//            completion(error)
        }) { (_, error) in
            // 让控制器知道我们加载数据失败
            completion(error)
        }
    }
    
    
    /// 解档账号
    ///
    /// - returns:
    private func loadAccount() -> HMUserAccount? {
        // 解档, 会调用 对象的 init?(coder aDecoder: NSCoder)
        let account = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? HMUserAccount
        
        // 需要判断accessToken的有效期,只有在有效期内才返回账号
        if let acc = account {
            // 有账号,过期时间和当前时间比较
            // 2021 > 2016
            // 测试时间,自己创造测试条件
//            acc.expiresDate = Date(timeIntervalSinceNow: -1000)
            let date = Date()
            if acc.expiresDate?.compare(date) == ComparisonResult.orderedDescending {
                // 没有过期
                return acc
            }
        }
        
        return nil
    }
    
    // MARK: - 获取用户头像和名称
    func loadUserInfo(completion: @escaping (Error?) -> Void) -> Void {
        let urlString = "users/show.json"
        
        // 可选绑定
//        if let access_token = userAccount?.access_token,let uid = userAccount?.uid  {
//            // 参数
//            let prarameters = [
//                "access_token": access_token,
//                "uid": uid
//            ]
//        }
        
        // 守卫,和可选绑定相反, userAccount?.access_token 没有值就进入分支,在后面还可以使用 access_token
        // 当一次性守卫多个,只要其中一个没有值,就会进入分支里面
        guard let access_token = userAccount?.access_token,
            let uid = userAccount?.uid else {
                print("userAccount?.access_token 没有值,或userAccount?.uid  没有值")
            return
        }
        
        // 在后面还可以使用 access_token
        // 参数
        let prarameters = [
            "access_token": access_token,
            "uid": uid
        ]
        
        // 发送get请求
        HMNetworkTool.shared.request(method: .GET, URLString: urlString, parameters: prarameters, progress: nil, success: { (_, responseObject) in
//            print("获取用户信息成功了: \(responseObject)")
            // 获取到了数据,需要保存到模型中
            let dict = responseObject as! [String: Any]
            self.userAccount?.screen_name = dict["screen_name"] as? String
            self.userAccount?.avatar_large = dict["avatar_large"] as? String
            
            // 将账号保存到沙盒中
            NSKeyedArchiver.archiveRootObject(self.userAccount!, toFile: self.path)
            completion(nil)
            }) { (_, error) in
                completion(error)
        }
        
    }
}
